From OpenBSD:

2009-04-19 22:34  sthen

        * misc.c (1.37): don't print extraneous padding characters when
          tab-completion file/command lists encounter a name too long for
          the width of the terminal.

          from Matthew Haub, no objections krw@.

2008-08-11 23:50  jaredy

        * tree.c (1.19): plug a memleak when freeing io redirection in
          commands.  the leaked memory is actually reclaimed when the
          command finishes but may grow until that happens, e.g. during
          command execution.

          ok phessler@.  testing sobrado@ jmc@ oga@.

2008-07-23 18:34  jaredy

        * c_sh.c (1.38), syn.c (1.28): fix stack abuse in the `time'
          commmand, using alloc()'d memory instead.

          reported by Thorsten Glaser, thanks.

          ok millert@, earlier version miod@

2008-07-21 19:30  millert

        * alloc.c (1.8): Extra sanity checking for afree();  OK deraadt@
          and pvalchev@

2008-07-12 14:33  miod

        * misc.c (1.34): Fix a strlcpy() bound.



Index: pdksh-5.2.14/tree.c
===================================================================
--- pdksh-5.2.14.orig/tree.c	2009-09-19 11:22:37.000000000 +0200
+++ pdksh-5.2.14/tree.c	2009-09-19 12:06:43.000000000 +0200
@@ -755,4 +755,5 @@
 			afree((void*)p->heredoc, ap);
 		afree((void*)p, ap);
 	}
+	afree(iow, ap);
 }
Index: pdksh-5.2.14/syn.c
===================================================================
--- pdksh-5.2.14.orig/syn.c	2009-09-19 11:22:37.000000000 +0200
+++ pdksh-5.2.14/syn.c	2009-09-19 12:06:43.000000000 +0200
@@ -375,6 +375,11 @@
 	  case TIME:
 		syniocf &= ~(KEYWORD|ALIAS);
 		t = pipeline(0);
+		if (t) {
+			t->str = alloc(2, ATEMP);
+			t->str[0] = '\0'; /* TF_* flags */
+			t->str[1] = '\0';
+		}
 		t = block(TTIME, t, NOBLOCK, NOWORDS);
 		break;
 
Index: pdksh-5.2.14/alloc.c
===================================================================
--- pdksh-5.2.14.orig/alloc.c	2009-09-19 11:22:37.000000000 +0200
+++ pdksh-5.2.14/alloc.c	2009-09-19 12:06:43.000000000 +0200
@@ -894,13 +894,20 @@
 void
 afree(void *ptr, Area *ap)
 {
-	struct link *l;
+	struct link *l, *l2;
 
 	if (!ptr)
 		return;
 
 	l = P2L(ptr);
 
+	for (l2 = ap->freelist; l2 != NULL; l2 = l2->next) {
+		if (l == l2)
+			break;
+	}
+	if (l2 == NULL)
+		internal_errorf(1, "afree: %p not present in area %p", ptr, ap);
+
 	if (l->prev)
 		l->prev->next = l->next;
 	else
Index: pdksh-5.2.14/c_sh.c
===================================================================
--- pdksh-5.2.14.orig/c_sh.c	2009-09-19 11:55:01.000000000 +0200
+++ pdksh-5.2.14/c_sh.c	2009-09-19 12:06:43.000000000 +0200
@@ -738,7 +738,6 @@
 	clock_t t0t, t1t = 0;
 	int tf = 0;
 	extern clock_t j_usrtime, j_systime; /* computed by j_wait */
-	char opts[1];
 
 	t0t = ksh_times(&t0);
 	if (t->left) {
@@ -751,11 +750,9 @@
 		 * really work as it only counts the last job).
 		 */
 		j_usrtime = j_systime = 0;
-		if (t->left->type == TCOM)
-			t->left->str = opts;
-		opts[0] = 0;
 		rv = execute(t->left, f | XTIME, xerrok);
-		tf |= opts[0];
+		if (t->left->type == TCOM)
+			tf |= t->left->str[0];
 		t1t = ksh_times(&t1);
 	} else
 		tf = TF_NOARGS;
Index: pdksh-5.2.14/misc.c
===================================================================
--- pdksh-5.2.14.orig/misc.c	2009-09-19 11:22:37.000000000 +0200
+++ pdksh-5.2.14/misc.c	2009-09-19 12:06:43.000000000 +0200
@@ -1123,6 +1123,7 @@
 	int r, c;
 	int rows, cols;
 	int nspace;
+	int col_width;
 
 	/* max_width + 1 for the space.  Note that no space
 	 * is printed after the last column to avoid problems
@@ -1141,6 +1142,9 @@
 			rows = n;
 	}
 
+	col_width = max_width;
+	if (cols == 1)
+		col_width = 0; /* Don't pad entries in single column output. */
 	nspace = (x_cols - max_width * cols) / cols;
 	if (nspace <= 0)
 		nspace = 1;
@@ -1149,7 +1153,7 @@
 			i = c * rows + r;
 			if (i < n) {
 				shf_fprintf(shf, "%-*s",
-					max_width,
+					col_width,
 					(*func)(arg, i, str, max_width + 1));
 				if (c + 1 < cols)
 					shf_fprintf(shf, "%*s", nspace, null);
